package com.javabase.study.ArrayStudy;

import java.util.Arrays;

/**
 * TODO
 * 内容：测试学习数组拷贝
 *     数组拷贝使用System类中的 static void arraycopy(object src,int srcpos,object
 *     dest,int destpos,int length)方法，该方法可以将src数组里的元素赋给dest数组，
 *     可以指定src的复制元素的起始位置和数量，目标数组的元素复制位置
 *  以下几种情况可以使用数组的拷贝来实现：
 *     1. 删除指定元素
 *     2. 再指定位置上插入元素
 *     3. 数组扩容
 * 数组特性：数组是一组相同类型数据的集合。
 *     1. 数组元素类型相同
 *     2. 数组长度是固定的
 *     3. 数组类型可以是任何类型，基本类型和引用类型都可以
 *     4. 数组再堆中存储
 * 数组一经创建其大小就不能被更改
 * 作者:jxx
 * 创建时间：2021/6/23
 */
public class TestArrayCopy {
    public static void main(String[] args){

        String[] strings = {"a","b","c","d","e","f","g","h","i","j","k"};

        int[] a = {1,2,3,4,5,6};
        Integer[] b = new Integer[4];

        System.arraycopy(a,2,b,0,3);

        for(Integer i : b ){
            System.out.println(i);
        }

        TestArrayCopy testArrayCopy = new TestArrayCopy();
        //String[] results = testArrayCopy.removeElement(strings,2);

       // String[] results = testArrayCopy.addElement(strings,2,"m");
        String[] results = testArrayCopy.increaseCapacity(strings);

        System.out.println(strings);
        System.out.println(results);
        for(String tmp : results){
            System.out.println(tmp);
        }

        System.out.println(Arrays.toString(results));
        System.out.println(Arrays.toString(strings));
    }

    /**
     * 使用数组拷贝实现指定索引位置上的元素删除
     * @param src 原数组
     * @param index 想要删除的元素的索引位置
     * @return  删除指定元素后的数组
     */
    public String[] removeElement(String[] src,int index){
        System.arraycopy(src,index + 1,src, index,src.length - index - 1);
        src[src.length - 1] = null;
        return  src;
    }

    /**
     * 在指定位置上添加指定元素数组一经创建，其大小就已经固定，不能更改原有数组的大小。
     *  增加元素只能通过创建新数组并将原数组元素复制到新数组中，然后将新元素添加在新数组中
     * @param src 原数组
     * @param index 添加位置的指定索引
     * @param element 指定添加的元素
     * @return 添加后的数主
     */
    public String[] addElement(String[] src,int index,String element){
        String[] strings = new String[src.length + 1];
        System.arraycopy(src,0,strings,0,index);
        strings[index] = element;
        System.arraycopy(src,index,strings,index + 1,src.length - index);
        return strings;
    }

    /**
     * 数组扩容 数组扩容默认容量提升为之前的两倍
     * 数组一经创建，其大小就已经固定，不能更改原有数组的大小。
     * 扩容只能通过创建新数组并将原数组元素复制到新数组中
     * @param src 原数组
     * @return 新数组
     */
    public String[] increaseCapacity(String[] src){

        int newCapacity = src.length * 2;
        String[] newStr = new String[newCapacity];
        System.arraycopy(src,0,newStr,0,src.length);
        return newStr;

    }
}
